void main() {
  test1();
  test2();
}


/// 封装--封好
/// 匿名函数
void test1() {
  //赋值给变量
  //无参匿名函数
  // var anonFunc1 = () => print('无参匿名函数');

  // anonFunc1() => print('无参匿名函数');
  anonFunc1(){
    print('无参匿名函数');
  }
  //函数编程  js
  // c  指针编程


  anonFunc1(); // 输出结果： 无参匿名函数

  //有参匿名函数
  // var anonFunc = (name) => 'I am $name';
  anonFunc(name) => 'I am $name';
  print(anonFunc('damon')); // 输出结果：  I am damon

  //通过()调用，不推荐
  //  (()=>print('不推荐'))();

  //匿名函数传参
  List test(List list, String func(str)) {
    for (var i = 0; i < list.length; i++) {
      list[i] = func(list[i]);
    }
    return list;
  }

  var list = ['d', 'a', 'm', 'o', 'n'];
  //String * int, Dart和Python可以这样用
  print(test(list, (str) => str * 2)); //[dd, aa, mm, oo, nn]

  //List.forEach()就用的匿名函数
  List list1 = [11, 12, 13];
  list1.forEach((item) => print('$item'));

  //返回Function对象（闭包）
  Function makeAddFunc(int x) {
    x++;
    return (int y) => x + y; // 返回的是 function 对象
  }

  var addFunc = makeAddFunc(2);
  print(addFunc(3)); // 6
}

void test2() {
  // 函数别名
  MyFunc myFunc;
  //可以指向任何同签名的函数
  myFunc = subtsract;
  myFunc(4, 2); // subtsract: 2
  myFunc = divide;
  myFunc(4, 2); // divide: 2.0
  //typedef 作为参数传递给函数
  calculator(4, 2, subtsract); // subtsract: 2
}

// 函数的类型是Function类型，typedef就是给Function取个别名，相当于进行一次简单的封装
// typedef MyFunc = Function(int a, int b);
typedef MyFunc(int a, int b);

//根据MyFunc相同的函数签名定义两个函数
subtsract(int a, int b) {
  print('subtsract: ${a - b}');
}

divide(int a, int b) {
  print('divide: ${a / b}');
}

//typedef 也可以作为参数传递给函数
calculator(int a, int b, MyFunc func) {
  func(a, b);
}



